package datasource

import (
	// 这是gorm 提供的mysql 驱动，可以源代码（mysql.go）发现，它是对原本的
	// "database/sql"(官方标准库), _ "github.com/go-sql-driver/mysql" (mysql 驱动)进行的封装!
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"sync"
)

// 全局保持一个, 数据库连接实例
var (
	DB *gorm.DB
)

var dbLock sync.Mutex

// 单例模式， DB全局一份即可
func InstanceDB() *gorm.DB {
	if DB == nil {
		// 并发安全。 创建锁
		dbLock.Lock()
		defer dbLock.Unlock()
		// 这里还需要加上一步！ 因为多并发执行的时候，可能多个任务都走到了这里认为没有 DB，
		// 排队等待获取锁， 去创建DB。 此时再判断一次，是否有DB，避免重复创建
		if DB != nil {
			return NewDb()
		}
		return NewDb()

	}
	return DB
}

// 创建数据库相关的实例对象
func NewDb() *gorm.DB {
	//sourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
	//	conf.DbMaster.User, conf.DbMaster.Pwd, conf.DbMaster.Host,
	//	conf.DbMaster.Port, conf.DbMaster.Database)
	dsn := "root:123456@tcp(127.0.0.1:3306)/lottery?charset=utf8mb4&parseTime=True&loc=Local"
	instance, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal("dbhelper.NewDbMaster NewEngine: error: ", err.Error())
		return nil
	}
	// 全局 DB 设置为当前的 instance
	DB = instance

	return DB
}
